package com.nurt.controller.dish;

import com.nurt.dto.ResultDto;
import com.nurt.entity.DishEntity;
import com.nurt.service.DishService;
import com.nurt.service.impl.DishServiceImpl;
import com.nurt.utils.ServletHelper;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.List;

/**
 * 菜品控制器，负责处理与菜品相关的HTTP请求。
 * {@code @WebServlet("/dishes/*")} 指定Servlet的URL模式，用于匹配所有以/dishes/开头的URL路径。
 */
@WebServlet("/dishes/*")
public class DishController extends HttpServlet {
    private DishService dishService;

    /**
     * 初始化方法，用于创建DishService实例。
     * 这里的DishService用于与数据库交互，处理菜品的增删改查操作。
     */
    public void init() {
        dishService = new DishServiceImpl();
    }

    /**
     * 处理GET请求。
     * 根据请求的路径信息，决定是返回所有菜品还是特定菜品的详细信息。
     * @param req HTTP请求对象，用于获取请求信息。
     * @param resp HTTP响应对象，用于发送响应信息。
     * @throws IOException 如果发生I/O错误。
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String pathInfo = req.getPathInfo();
        if (pathInfo == null || pathInfo.equals("/")) {
            // 如果路径信息为空或为根路径，返回所有菜品。
            List<DishEntity> dishes = dishService.getDishes();
            resp.getWriter().write(ResultDto.success(dishes));
        } else {
            // 否则，根据路径信息获取特定菜品的详细信息。
            // getDish
            String dishId = pathInfo.substring(1);
            DishEntity dish = dishService.getDish(Integer.parseInt(dishId));
            resp.getWriter().write(ResultDto.success(dish));
        }
    }

    /**
     * 处理POST请求。
     * 用于创建新的菜品。
     * @param req HTTP请求对象，用于获取请求信息。
     * @param resp HTTP响应对象，用于发送响应信息。
     * @throws IOException 如果发生I/O错误。
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // createDish
        DishEntity newDish = ServletHelper.getRequestBodyAsObject(req, DishEntity.class);
        int dishId = dishService.addDish(newDish);
        resp.getWriter().write(ResultDto.success(dishId));
    }

    /**
     * 处理PUT请求。
     * 用于更新已有菜品的信息。
     * @param req HTTP请求对象，用于获取请求信息。
     * @param resp HTTP响应对象，用于发送响应信息。
     * @throws IOException 如果发生I/O错误。
     */
    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // updateDish
        String dishIdStr = req.getPathInfo().substring(1);
        int dishId = Integer.parseInt(dishIdStr);
        DishEntity dish = ServletHelper.getRequestBodyAsObject(req, DishEntity.class);
        dish.setDishId(dishId);
        dishService.updateDish(dish);
        resp.getWriter().write(ResultDto.success(dish));
    }
}
